Moduri de Adresare
Modurile de adresare constituie un instrument principal pentru a reprezenta in memoria masinii imaginea datelor asa cum este aceasta vazuta de programatorul in limbaj de nivel inalt. Ele permit programatorului sa construiasca si sa utilizeze structuri complexe, multidimensionale de date, in timp ce echipamentul poate trata doar matrici lineare cu elemente de dimensiune fixa. Pentru accesul la un element al unei structuri complexe de date trebuie evaluata adresa de memorie corespunzatoare inceputului zonei de memorie in care se pastreaza acel element. De regula, aceasta operatie se efectueaza prin mai multe instructiuni utilizind mai multe moduri de adresare.
Cu cit calculele efectuate in cadrul modului de adresare sint mai complexe, cu atit numarul mediu de instructiuni cerut de accesul la un element al unei structuri complexe de date este mai mic. Avind in vedere ca modurile complexe de adresare lungesc instructiunea ca spatiu ocupat in memorie,ii maresc timpul de executie si complica arhitectura unitatii de comanda, astfel de instructiuni isi dovedesc utilitatea doar daca sint folosite in mod frecvent.

Elemente de Baza Privind Modurile de Adresare:
Marea varietate a modurilor de adresare utilizate de gama de microprocesoare disponibile ofera o caracteristica generala: Oricare mod se obtine ca o combinatie intre un numar relativ mic de obiecte si functii de baza.
Se considera ca un obiect sau o functie sint fundamentale daca, in absenta acelui obiect sau a acelei functii, masina nu este capabila sa emuleze nici un mod de adresare. In consecinta obiectele fundamentale sint constituite din registre si deplasamente (displacement) sau offseturi stocate in instructiune. Functiile fundamentale sint adunarea, deplasarea (shift), adresarea indirecta (indirection). Operatia de deplasare ar putea fi inlocuita de adunari/scaderi, insa timpul care s-ar consuma in acest caz ar fi prea mare, asa incit deplasarea este considerata drept functie fundamentala. Adunarea include si operatiile de incrementare si decrementare, cazuri particulare de adunari.

Registre - Situate in unitatea centrala de prelucrare (CPU), unitatea de aritmetica in virgula mobila (FPU) si in unitatea de gestiune a memoriei (MMU). In discutarea modurilor de adresare nu se tine cont de unitatea careia un anumit registru ii apartine.
Principalele functii ale registrelor in ceea ce priveste modurile de adresare sunt:
-registru operand (operand register): continutul registrului este insusi operandul la care se face referire
-registru adresa (address register): continutul registrului este adresa operandului la care se face referire
-registru baza (base register): registrul contine o adresa care, pentru obtinerea adresei complete a operandului, se va utiliza in conjunctie cu continutul unui alt registru sau al unui camp imediat al instructiunii.
Camp Imediat (Immediate Field)=camp, adesea optional, al unei instructiuni, dedicat pastrarii unei informatii ce se va utiliza in determinarea adresei la care se afla operandul in discutie.
Utilizari ale campului imediat:
-operand imediat (immediate operand): continutul campului imediat este chiar operandul la care se face referire;
-adresa imediata (immediate address): continutul campului imediat constituie adresa operandului la care se face referire;
-offset/deplasament: campul imediat contine un intreg (cu semn pentru offset), care se utilizeaza in conjunctie cu continutul unui registru pentru a produce adresa operandului la care se face referire.

Functiile fundamentale:
Adunarea - Toate modurile de adresare, cu exceptia celor mai simple, necesita adunarea a doua sau mai multe valori. Caz particular: incrementarea/decrementarea.
Adresarea indirecta - Functie al carei argument este dat de rezultatul unor calcule, foloseste argumentul pentru a determina, prin adresarea memoriei, operandul la care se face referire. Modurile complexe de adresare pot folosi de mai multe ori functia de adresare indirecta pentru a obtine adresa finala a operandului.
Deplasarea - Utilizata la executarea operatiei de indexare. Indexarea produce offsetul unui element din matricea liniara, avand ca baza de plecare indicii elementului. Daca se noteaza cu i indicele (sau indexul) elementului la care se face referire si acceptind ca valoarea cea mai mica a oricarui indice este 0, offsetul elementului i in cadrul matricii liniare este i * w, unde w este lungimea unui element al matricii. Intr-un caz general, indexarea necesita o inmultire. Cum w are, de regula, valoarea 1,2 sau 4 (exprimata in octeti), inmultirea i * w se face prin deplasarea la stinga a lui i cu un numar de pozitii binare egal cu logaritmul  in  baza  2 al lui w (0, 1 sau 2 pozitii pentru w = 1,2 sau 4). Deplasarea se face cu mult mai rapid decit inmultirea, ceea ce o recomanda pentru includerea in functiile de baza pentru adresare.

Corelatia mod de adresare-cicluri masina
Exista o corespondenta intre functiile si obiectele de baza ale modurilor de adresare, pe de o parte, si ciclurile masina necesare adresarii operandului exprimat intrun anumit mod de adresare, pe de alta parte. In fond, fiecare aplicare a functiei de adresare indirecta produce un ciclu suplimentar de acces la memorie, intrucit rezultatul calculelor anterioare este folosit ca adresa pentru accesul la memorie. Acelasi efect apare si in cazul utilizarii unui cimp imediat, intrucit  acesta constituie o componenta a instructiunii, care trebuie citita din memorie. De cele mai multe ori aceste cimpuri sint mai scurte decit lungimea cuvintului de date extern al microprocesorului,asa incit un asemenea cimp este citit in unitatea centrala simultan cu codul operatiei, fara a mai fi necesare cicluri suplimentare de acces la memorie. In general adunarea si deplasarea necesita fiecare cite un ciclu al unitatii aritmetice logice. In unele structuri specializate (barrel shuffler) adunarea si deplasarea se executa intrun unicciclu.

Notatii:
g-numele sau numarul unui registru, accesibil programatorului in limbaj de asamblare ;
M[x]-functia de adresare indirecta, aplicata valorii x. Rezultatul ei este informatia memorata la adresa x in memoria principala;
G[g]-valoarea stocata in registrul g
a.sh.b-valoarea rezultata din deplasarea lui a la stanga cu b pozitii binare ;
d-valoarea deplasamentului, memorata intrun camp al instructiunii.

1.ADRESARE DIRECTA PRIN REGISTRU (Register Operand Addressing)
Caracterizare: G[g]
Cel mai simplu mod de adresare este cel care nu necesita aplicarea nici uneia din functiile de baza pentru a obtine valoarea operandului. In aceasta clasa singurul mod de adresare este cel direct prin registru (register operand addressing). Operandul este stocat in registru, deci nu este necesar un ciclu memorie sau ciclu ALU pentru a i obtine valoarea. Valoarea operandului este data de G(g). Adresarea directa prin registru reprezinta modul cel mai compact si cel mai rapid de adresare. El este folosit pentru manipularea operanzilor utilizati in mod frecvent in sectiunea curenta a programului, operanzi care sint incarcati in registre in scopul minimizarii timpului de acces.

2.ADRESARE INDIRECTA PRIN REGISTRU (Register Indirect Addressing)
Caracterizare: M[G[g]]
Acest mod de adresare utilizeaza continutul registrului g, specificat in instructiune, pentru a adresa operandul. Intrucit se utilizeaza o operatie de adresare indirecta, extragerea operandului necesita un ciclu suplimentar de memorie.
Adresarea indirecta prin registru este folositoare pentru accesul la elementele structurilor complexe de date, altfel inaccesibile doar cu unicul mod de adresare permis de masina. Calculul adresei, disponibila  in final in registrul in discutie, necesita o secventa de instructiuni al caror rezultat este adresa elementului solicitat.

3.ADRESARE CU AUTOINCREMENTARE/AUTODECREMENTARE (Autoincrement/Autodecrement Addressing)
Baza modurilor de adresare implementate in oricare calculator. In mod normal, acest mod de adresare este utilizat in conjunctie cu indicatorul de stiva si cu contorul programului. Functioneaza in mod similar cu adresarea indirecta prin registru, intrucat registrul g, specificat explicit sau implicit in instructiune, contine adresa operandului. In plus fata de modul precedent, continutul registrului este incrementat/decrementat cu o cantitate determinata de lungimea operandului la care se realizeaza accesul, iar pentru ca in general este un mod de adresare utilizat pt intregi valoarea incrementului este 1, 2, 4 sau 8.
Doua moduri de adresare: cu postincrementare si cu predecrementare. Este de mentionat ca modurile de adresare cu postincrementare si predecrementare sint singurele care au efecte secundare, manifestate in modificarea continutului registrului g. Aceasta modificare este de dorit, deoarece ea permite accesul secvential in ordine ascendenta la memoria program (postincrementare), precum si implementarea comoda a mecanismului de stiva LIFO (last in first out), indispensabil pentru buna functionare a sistemului de intrerupere, precum si pentru operarea cu subrutine. Adresarea cu postincrementare permite si obtinerea modului de adresare numit "adresarea imediata a operandului", folosita de toate microprocesoarele pentru a introduce constante in sirul de instructiuni. Adresarea imediata a operandului se obtine prin utilizarea adresarii cu postincrementare si specificind contorul programului drept registru de utilizat pentru adresare. Acest mod de adresare permite prelucrarea de instructiuni compuse din mai multe cuvinte.  
3.a. Postincrementare
Caracterizare-adresare indirecta apoi incrementare cu N: 
M[G[g]]
G[g]:=G[g]+N
3.b. Predecrementare
Caracterizare-decrementare cu N si apoi adresare indirecta:
G[g]:= G[g]-N
M[G[g]]

4.ADRESARE INDIRECTA CU AUTOINCREMENTARE/AUTODECREMENTARE (Autoincrement/Autodecrement Indirect Addressing)
Acest mod de adresare se poate obtine prin aplicarea unei adresari indirecte suplimentare. Functionarea in modul de adresare indirecta cu postincrementare presupune dubla adresare indirecta urmata de postincrementarea cu N a continutului registrului g
In modul de adresare indirecta cu predecrementare are loc decrementarea cu N a continutului registrului g urmata de o dubla adresare indirecta.
4.a.Postincrementare
M[M[G[g]]]
G[g]:=G[g]+N
4.b.Predecrementare
G[g]:=G[g]-N
M[M[G[g]]]
Ca la orice adresare cu autoincrementare/autodecrementare se manifesta efectul secundar de modificare a continutului registrului g folosit pentru adresare.
In cazul particular in care adresarea indirecta cu postincrementare foloseste ca registru contorul programului se obtine adresarea directa , mod de adresare existent in toate microprocesoarele. La adresarea directa adresa operandului este memorata ca un cimp al instructiunii. Dupa citirea codului instructiunii ( realizata prin modul de adresare cu postincrementare ) contorul programului indica urmatorul cimp al instructiunii. Adresarea indirecta cu postincrementare permite accesul la operand si actualizarea contorului programului. Intrucit microprocesoarele de 8 si 16 biti au lungimea cuvintului de adresa mai mare decit lungimea cuvintului de date , sint necesare mai multe cicluri de acces la memorie pentru citirea adresei operandului.
Adresarea directa specifica adresa operandului ca parte componenta a instructiunii, care se stabileste in momentul compilarii si nu mai poate fi schimbata in timpul executiei programului. Asa cum s a vazut , limbajele de nivel inalt care folosesc recursivitatea nu pot folosi adresarea directa ca urmare a dinamicii adreselor in procesul de recursivitate. Cu exceptia variabilelor globale , celelalte variabile au adrese alocate in timpul rularii pentru programele recursive , adrese care nu se pot insera in codul instructiunii.
Utilizarea adreselor stocate in codul instructiunii este legata de operatiile de salt sau apeluri de subrutine , deci nu de specificarea de variabile propriu   zise.

5.ADRESAREA INDIRECTA BAZATA SI CU DEPLASAMENT (Base Displacement Indirect Addressing)
Se subliniaza faptul ca obtinerea deplasamentului presupune un ciclu de memorie si incrementarea contorului programului, ceea ce face ca numarul de cicluri de acces la memorie necesare pentru obtinerea operandului sa fie 2. Operatiile efectuate sint adunarea si incrementarea. Si aici trebuie avut in vedere faptul ca lungimea deplasamentului poate fi variabila, ceea ce poate rezulta in necesitatea unui ciclu suplimentar de memorie, sau, dimpotriva, la diminuarea numarului de cicluri de memorie impus de obtinerea operandului.
Adresarea bazata cu deplasament este foarte potrivita pentru executarea programelor scrise in limbaj de nivel inalt, pentru ca ofera un mod natural de adresare a scalarilor.
De asemenea, adresarea bazata solutioneaza problema de adresare a variabilelor si a informatiilor de comanda. Sectiunea de cod in limbaj de asamblare destinata implementarii apelarii procedurii specifica un anumit registru, de uz general sau specializat, pentru a indica inceputul noului cadru. Acest registru se numeste indicator al cadrului local (local frame pointer ). In continuare compilatorul poate genera instructiuni de acces la variabilele locale prin utilzarea indicatorului cadrului local drept registru baza. Deplasamentul este dat de suma lungimilor cimpului si variabilelor ce preced variabila adresata.
Aproape intotdeauna indicatorul cadrului local este pastrat intr un registru , deoarece el reprezinta informatia cheie pentru accesul la toate variabilele locale, iar probabilitatea de a le utiliza in cadrul procedurii este mare. Un alt indicator de cadru , si el pastrat , de regula , intr un registru , este cel indicind spre variabilele globale , la care orice procedura are acces. In fine , un al treilea registru este rezervat pentru stocarea indicatorului catre un eventual cadru situat intre cadrul programului principal si cel al procedurii locale.
Adresarea indirecta bazata si cu deplasament este frecvent utilizata pentru accesul variabilelor atit locale, cit si nelocale , cu conditia ca aceste variabile sa fie scalari. In structurile complexe de date acest mod de adresare furnizeaza doar adresa de inceput a zonei de memorie alocate intregii structuri. Pentru localizarea unui element sint necesare calcule suplimentare.
Situatiile in care contorul programului este folosit drept registru baza sint numite adresari relative, intrucit cimpul din instructiune indica pozitia relativa a operandului in raport cu adresa la care se afla instructiunea. Acest mod de adresare impune utilizarea unui intreg cu semn pentru deplasament , in timp ce in alte moduri deplasamentul este un numar pozitiv. Necesitatea deplasamentului cu semn este mai stringenta pentru instructiunile de salt. 
Caracterizare:
M[G[g]+d]

6.ADRESAREA DUBLU INDIRECTA BAZATA SI CU DEPLASAMENT (Base Displacement Indirect Indirect Addressing)
M[M[G[g]+d]]
Utilizabil pentru adresarea variabilelor la care referirea se face prin intermediul unui indicator.
Registrul baza este intotdeauna utilizat pentru a indica adresa de inceput a cadrului -> deplasamentul corespunde pozitiei indicatorului variabil in interiorul cadrului.
Dubla adresare indirecta este folosita intai pentru a obtine valoarea indicatorului si, apoi, valoarea operandului propriuzis.
O alta aplicatie tipica a modului de adresare descris mai sus este realizarea accesului la parametrii procedurii transferate prin referire. In astfel de aplicatii in interiorul procedurii se stocheaza nu valoarea ci adresa parametrului.

7.ADRESAREA INDIRECTA BAZATA INDEXATA (Base Indexed Indirect Addressing)
M[G[g1]+G[g2].Sh.N]
Cele mai simple structuri cu care opereaza limbajele de nivel inalt sunt matricele liniare de scalari.
Scalarii se reprezinta prin campuri de memorie de 8, 16, 32 sau 64 biti. Calcularea deplasamentului unui element in cadrul matricei liniare se obtine prin deplasarea la stanga a numarului ce reprezinta indicele (indexul) unui element cu 0, 1, 2 sau, respectiv 3 pozitii binare, presupunand ca valoarea initiala a indicelui este 0.
Modul de adresare indirecta indexata bazata este folosit pentru accesul la un element al unei matrice unidimensionale de scalari, stocata intro zona de memorie a carei adresa de inceput este continuta in registrul baza.

8.ADRESAREA INDIRECTA INDEXATA CU POSTINCREMENTARE (Postincrement Indexed Indirect Addressing)
M[G[g1]+G[g2].sh.N],
G[g1]:=G[g1]+N
Se obtine din modul de adresare indirecta indexata bazata prin adaugarea unei operatii de incrementare a continutului unuia din cele doua registre, operatie efectuata dupa extragerea operandului.
Deci continutul registrului g2 se deplaseaza la stanga cu 0, 1 sau 2 pozitii binare; rezultatul se aduna cu continutul registrului g1, obtininduse adresa operandului; in fine, continutul registrului g1 se incrementeaza cu valoarea N1, egala cu 1, 2, 4 sau, respectiv, 8.

9.ADRESAREA INDIRECTA INDEXATA CU PREDEREMENTARE (Predecremenet Indexed Indirect Addressing)
G[g1]:=G[g1]-N
M[G[g1]+G[g2].sh.N]

10.ADRESAREA INDIRECTA INDEXATA BAZATA SI CU DEPLASAMENT (Base Displacement Indirect Addressing)
M[G[g1]+d+G[g2].sh.N]
Adresarea indirecta indexata bazata si cu deplasament este o metoda mai buna de acces la elementele unei matrice unidimensionale de scalari, atat fata de metoda de adresare indirecta bazata cu deplasament, cat si fata de cea de adresare indirecta indexata bazata.
Daca g1 contine indicatorul cadrului local, indicele elementului matricei este continut de g2, iar d indica deplasamentul in interiorul cadrului al adresei de inceput a zonei de memorie ce contine elementele matricei, modul de adresare indirecta indexata bazata si cu deplasament permite accesul intro singura instructiune al oricarui element al matricei locale unidimensionale de scalari.

11.ADRESAREA INDIRECTA INEXATA INDIRECT CU POSTINCREMENTARE (Postincrement Indirect Indexed Indirect Addressing)
M[G[g1]+G[g2].sh.N1]
G[g1]:=G[g1]+N2
Se folosesc doua registre: registrul baza g1 si registrul index g2. Continutul lui g1 permite adresarea si citirea continutului unei locatii de memorie. Acest continut se aduna la rezultatul deplasarii spre stanga cu N2 pozitii binare a continutului registrului g2 (N2= 0, 1 sau 2). In felul acesta se obtine adresa operandului. In final, continutul registrului g1 este incrementat cu N1 unitati; valoarea lui N1 depinde de dimensiunea adresei. Evident, nu exista legatura intre N1 si N2.

12.ADRESAREA INIRECTA INDEXATA INDIRECT BAZATA CU DEPLASAMENT (Base Displacement Indirect Indexed Indirect Addressing)
M[M[G[g1]+d]+G[g2].sh.N]

13.ADRESAREA INDIRECTA CU DEPLASAMENT INDIRECT BAZATA SI CU DEPLASAMENT (Base Displacement Indirect Displacement Indirect Addressing)
M[M[G[g]+d1]+d2]
Permite accesul intro singura instructiune la scalari nelocali. Indicatorul cadrului local este incarcat in g.
   d1 - deplasamentul (in cadrul campului de afisare al cadrului curent) indicatorului spre cadrul in care se afla variabila la care se face referire.
   d2 - deplasamentul in interiorul cadrului a scalarului referit.
Un alt fel de utilizare permite accesul la un camp al unei inregistrari locale la care referirea se face cu ajutorul unui indicator. In acest caz d1 este deplasamentul indicatorului in interiorul cadrului, iar d2 este deplasamentul (fata de inceputul zonei ce contine inregistrarea, inceput specificat prin indicatorul obtinut prin M[G[g]+d1]]) al campului la care se face referire.

14.ADRESARE INDIRECTA INDEXATA CU DEPLASAMENT INDIRECT BAZATA SI CU DEPLASAMENT (Base Displacement Indirect Displacement Indexed Indirect Addressing)
M[M[G[g1]+d1]+d2+G[g2].sh.N]
Permite accesul la matrice unidimensionale nelocale de scalari, fapt datorat adaugarii indexarii la modul de adresare indirecta cu deplasament indirect bazata si cu deplasament.
In g1 se incarca indicatorul cadrului local.
d1 - deplasamentul indicatorului (din campul de afisare) catre cadrul ce contine matricea de interes.
d2 - deplasamentul in cadrul de interes al inceputului zonei de memorie ce contine matricea
g2 contine indicele elementului la care se face referire.

Concluzii privind modurile de adresare

Modurile de adresare se pot grupa in trei mari categorii : 
a. moduri simple, cum sint cele de adresare cu operandul in registru, indirect prin registru, imediata sau directa;
b. moduri in care procesul de evaluare a adresei presupune adunarea continutului unui registru cu unul sau doua deplasamente, continute in cimpuri ale instructiunii, fiind,eventual, posibila si utilizarea unei functii de indexare;
c. moduri in care procesul de evaluare a adresei necesita adunarea continuturilor unuia sau ale mai multor registre, eventual si cu folosirea unei functii de indexare, urmata de incrementarea, sau precedata de decrementarea continutului unuia din registrele implicate.
In general, toate sistemele de calcul folosesc modurile simple de adresare, care reprezinta modurile de baza de adresare a operanzilor, toate acestea fiind utile pentru executia programelor scrise in limbaj de nivel inalt. Face exceptie modul de adresare directa, folositor doar pentru segmentul de cod.
Modurile de adresare cu registru baza si deplasament sint adecvate pentru programele in limbajele de nivel inalt care permit recursivitatea,care necesita alocarea dinamica a variabilelor definite in interiorul procedurilor sau functiilor. Alocarea dinamica nu permite compilatorului sau editorului de legaturi sa insereze in cod adresele variabilelor manipulate. La momentul compilarii singura informatie disponibila despre amplasarea variabilelor este deplasamentul acestor variabile in cadrul zonei de memorie sau cadrului rezervat pentru procedura in care sint definite. De aici decurge utilitatea unui registru baza, care pastreaza adresa de inceput a cadrului, si a modurilor de adresare ce folosesc acest registru si deplasamentul inserat in cod de catre compilator.
Modurile de adresare cu postincrementare/predecrementare sint foarte asemanatoare cu unele moduri de adresare ce folosesc registrul baza, diferenta constind in incrementare/decrementare in locul adunarii cu valoarea deplasamentului. Postincrementarea simpla este folosita de toate microprocesoarele pentru extragerea instructiunilor, ca si pentru modurile de adresare imediata si directa. Autoincrementarea/autodecrementarea sint folosite si in legatura cu stiva, pentru extragerea/introducerea de date in stiva. Nu toate registrele unitatii centrale permit adresarea in autoincrementare/autodecrementare.
Aceleasi operatii de autoincrementare/autodecrementare sint folosite si pentru implementarea operatiilor cu siruri, care necesita incrementarea automata a indicatorului sirului. Modurile complexe bazate pe autoincrementarea registrelor folosesc, de exemplu, pentru manipularea unui bloc de operanzi ale caror adrese sint memorate intr un sir de locatii continue. Desi de o mai mare utilitate, modurile de adresare utilizind registre baza conduc la scaderea vitezei de executie drept urmare a ciclurilor suplimentare de memorie cerute de obtinerea valorii deplasamentului. O cale de diminuare a scaderii performantei consta in utilizarea celor mai scurte deplasamente posibile. 


Alte Caracteristici Arhitecturale ale Microprocesoarelor
Se vor considera caracteristici referitoare la:
->Organizarea registrelor
->Intreruperi, Capcane si Mijloace de Depanare
Organizarea Registrelor
Practica a demonstrat utilitatea registrelor in imbunatatirea performantelor microprocesoarelor. Exemplu: arhitectura procesoarelor RISC, unde se intalnesc zeci sau chiar sute de registre in componenta CPU.
Efectele pozitive ale utilizarii registrelor:
-operatiile asupra continutului registrelor sunt mai rapide decit cele asupra operanzilor continuti in memorie, pentru ca ALU are acces direct la registre 
-lungimea medie a programelor scade
DAR continuturile registrelor (asa numitul context) trebuie salvate la aparitia unei intreruperi sau capcane sau atunci cand, in regim de multiprogramare, are loc comutarea programului curent.
In consecinta, un set numeros de registre conduce la timpi mai lungi de tratare a intreruperii sau de planificare a taskurilor.